#include "soil_moisture.h"

void SOIL_MOISTURE_Init()
{
    // 打开要使用的 GPIO 和 ADC 的时钟
    RCC_APB2PeriphClockCmd(SOIL_MOISTURE_GPIO_CLK | SOIL_MOISTURE_ADC_CLK, ENABLE);
    // 初始化 GPIO
    GPIO_InitTypeDef GPIO_InitStruct = {
        .GPIO_Pin = SOIL_MOISTURE_GPIO_PIN,
        .GPIO_Mode = GPIO_Mode_AIN,
        .GPIO_Speed = GPIO_Speed_50MHz,
    };
    GPIO_Init(SOIL_MOISTURE_GPIO_PORT, &GPIO_InitStruct);
    // 初始化 ADC
    ADC_InitTypeDef ADC_InitStruct = {
        .ADC_Mode = ADC_Mode_Independent,                  // 独立模式，不需要多个 ADC 自动同步运行
        .ADC_ScanConvMode = DISABLE,                       // 禁止扫描模式，多通道才要，单通道不需要
        .ADC_ContinuousConvMode = ENABLE,                  // 启用连续转换模式
        .ADC_ExternalTrigConv = ADC_ExternalTrigConv_None, // 不用外部触发转换，软件开启即可
        .ADC_DataAlign = ADC_DataAlign_Right,              // 转换结果右对齐
        .ADC_NbrOfChannel = 1,                             // 要使用的转换通道数量
    };
    ADC_Init(SOIL_MOISTURE_ADCx, &ADC_InitStruct);
    // 配置 ADC 时钟 PCLK2 的 8 分频
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
    // 配置 ADC 通道转换顺序为 1，第一个转换，采样时间为 239.5 个时钟周期
    ADC_RegularChannelConfig(SOIL_MOISTURE_ADCx, SOIL_MOISTURE_ADC_CHANNEL, 1, ADC_SampleTime_239Cycles5);
    // 开启 ADC
    ADC_Cmd(SOIL_MOISTURE_ADCx, ENABLE);
    // 初始化 ADC 校准寄存器
    ADC_ResetCalibration(SOIL_MOISTURE_ADCx);
    // 等待校准寄存器初始化完成
    while (ADC_GetResetCalibrationStatus(SOIL_MOISTURE_ADCx))
    {
    }
    // ADC 开始校准
    ADC_StartCalibration(SOIL_MOISTURE_ADCx);
    // 等待校准完成
    while (ADC_GetCalibrationStatus(SOIL_MOISTURE_ADCx))
    {
    }
    // 由于没有采用外部触发，所以使用软件触发ADC转换
    ADC_SoftwareStartConvCmd(SOIL_MOISTURE_ADCx, ENABLE);
}
